<template>
  <Dialog v-model="dialogVisible" title="导入上课场地信息" width="400">
    <el-form
      ref="formRef"
      v-loading="formLoading"
      label-width="120px"
    >
      <el-form-item label="模板下载">
        <el-button type="primary" @click="importTemplate" plain>
          <Icon icon="ep:download" class="mr-5px" /> 点击下载
        </el-button>
      </el-form-item>
      <el-form-item label="文件上传">
        <el-upload
          ref="uploadRef"
          v-model:file-list="fileList"
          :auto-upload="false"
          :on-change="handleFileChange"
          :on-remove="handleFileRemove"
          :before-upload="beforeUpload"
          :limit="1"
          accept=".xls,.xlsx"
          drag
        >
          <Icon icon="ep:upload" />
          <div class="el-upload__text">将文件拖到此处，或<em>点击上传</em></div>
          <template #tip>
            <div class="el-upload__tip text-center">
              <span>仅允许导入 xls、xlsx 格式文件。</span>
            </div>
          </template>
        </el-upload>
      </el-form-item>
      <el-form-item label="是否更新">
        <el-radio-group v-model="updateSupport">
          <el-radio :label="true">是</el-radio>
          <el-radio :label="false">否</el-radio>
        </el-radio-group>
        <div class="text-gray-500 text-xs mt-1">
          是否更新已经存在的上课场地信息数据
        </div>
      </el-form-item>
    </el-form>
    <template #footer>
      <el-button @click="submitForm" type="primary" :disabled="formLoading || !currentFile">确 定</el-button>
      <el-button @click="dialogVisible = false">取 消</el-button>
    </template>
  </Dialog>
</template>

<script setup lang="ts">
import { ClassLocationApi } from '@/api/ao/classlocation'
import download from '@/utils/download'

/** 上课场地信息导入表单 */
defineOptions({ name: 'ClassLocationImportForm' })

const emit = defineEmits(['success']) // 定义 success 事件，用于操作成功后的回调

const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗

const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false) // 表单的加载中
const updateSupport = ref(false) // 是否支持更新
const fileList = ref([]) // 文件列表
const currentFile = ref(null) // 当前选择的文件
const formRef = ref() // 表单 Ref
const uploadRef = ref()

/** 打开弹窗 */
const open = () => {
  dialogVisible.value = true
  updateSupport.value = false
  fileList.value = []
  currentFile.value = null
  resetForm()
}

/** 文件变化处理 */
const handleFileChange = (file) => {
  if (file.raw) {
    currentFile.value = file.raw
    message.success('文件上传成功')
  }
}

/** 文件移除处理 */
const handleFileRemove = () => {
  currentFile.value = null
  fileList.value = []
}

/** 上传前检查 */
const beforeUpload = (file) => {
  const isExcel = file.type === 'application/vnd.ms-excel' ||
                  file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  if (!isExcel) {
    message.error('只能上传 Excel 文件!')
    return false
  }
  const isLt10M = file.size / 1024 / 1024 < 10
  if (!isLt10M) {
    message.error('文件大小不能超过 10MB!')
    return false
  }
  return false // 阻止自动上传
}

/** 提交表单 */
const submitForm = async () => {
  // 校验是否上传文件
  if (!currentFile.value) {
    message.error('请先上传文件')
    return
  }

  try {
    formLoading.value = true

    // 构建表单数据
    const data = new FormData()
    data.append('file', currentFile.value)
    data.append('updateSupport', String(updateSupport.value))

    // 发起导入请求
    const result = await ClassLocationApi.importClassLocation(data)

    console.log('导入结果：', result) // 添加调试日志

    // 处理导入结果
    if (result) {
      const hasSuccess = (result.createClassLocationCount > 0 || result.updateClassLocationCount > 0)
      const hasFailure = (result.failureClassLocationCount > 0)

      if (hasSuccess) {
        // 有成功记录，显示成功消息（可能包含部分失败）
        let text = '上传成功数量：' + result.createClassLocationCount + ';'
        text += '更新成功数量：' + result.updateClassLocationCount + ';'
        if (hasFailure) {
          text += '失败数量：' + result.failureClassLocationCount + ';'
          if (result.failureClassLocationMessages && result.failureClassLocationMessages.length > 0) {
            text += '失败数据：' + result.failureClassLocationMessages.join(', ')
          }
        }
        message.success(text)
      } else if (hasFailure) {
        // 只有失败记录，显示失败消息
        let errorText = `导入失败，失败数量：${result.failureClassLocationCount}`
        if (result.failureClassLocationMessages && result.failureClassLocationMessages.length > 0) {
          // 只显示前5个错误，避免信息过多
          const errorMessages = result.failureClassLocationMessages.slice(0, 5)
          errorText += '\n错误详情：\n' + errorMessages.join('\n')
          if (result.failureClassLocationMessages.length > 5) {
            errorText += `\n... 还有 ${result.failureClassLocationMessages.length - 5} 个错误`
          }
        }
        message.error(errorText)
      } else {
        // 没有成功也没有失败，可能是空文件或其他问题
        message.warning('没有数据被处理，请检查文件内容')
      }
    } else {
      message.error('导入失败，请检查数据格式')
    }

    dialogVisible.value = false
    emit('success')
  } catch (error) {
    console.error('导入失败:', error)
    console.error('错误详情:', error.response?.data)

    let errorMessage = '导入失败'
    if (error.response?.data?.msg) {
      errorMessage += '：' + error.response.data.msg
    } else if (error.message) {
      errorMessage += '：' + error.message
    } else {
      errorMessage += '，请检查文件格式和数据'
    }

    message.error(errorMessage)
  } finally {
    formLoading.value = false
  }
}

/** 重置表单 */
const resetForm = () => {
  // 重置表单数据
}

/** 下载模板 */
const importTemplate = async () => {
  try {
    const data = await ClassLocationApi.importClassLocationTemplate()
    download.excel(data, '上课场地信息导入模板.xls')
  } catch {
    message.error('下载模板失败')
  }
}

defineExpose({ open }) // 提供 open 方法，用于打开弹窗
</script>
